﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PlaylistGenEngine.VOs;
using System.Collections;
using PlaylistGenEngine.GeradorDeArquivo;

namespace PlaylistGenerator_v1._0
{
    public partial class FormGeraGrade : Form
    {

        #region Inicialização e Configurações
        private List<Pasta> pastasMusicas;
        private List<Pasta> pastasComerciais;
        private Form formParent;

        public FormGeraGrade(List<Pasta> pastasMusicas,
            List<Pasta> pastasComerciais, Form formParent)
        {
            this.pastasMusicas = pastasMusicas;
            this.pastasComerciais = pastasComerciais;
            this.formParent = formParent;
            InitializeComponent();
            listPastasMusicas.DisplayMember = "nomeDaPasta";
            listPastasComerciais.DisplayMember = "nomeDaPasta";
            listGrade.DisplayMember = "nomeDaPasta";
            preencheListBox(listPastasMusicas, pastasMusicas);
            preencheListBox(listPastasComerciais, pastasComerciais);
        }

        private void FormGeraGrade_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.formParent.Enabled = true;
        }

        private void preencheListBox(ListBox list, List<Pasta> pastas)
        {
            list.Items.AddRange(pastas.ToArray());
        }
        #endregion

        #region Listeners Botões
        private void listPastasMusicas_SelectedIndexChanged(object sender, EventArgs e)
        {
            btnAdicionaPastaMusica.Enabled = listPastasMusicas.SelectedIndex > -1;
        }

        private void listPastasComerciais_SelectedIndexChanged(object sender, EventArgs e)
        {
            btnAdicionaPastaComercial.Enabled = listPastasComerciais.SelectedIndex > -1;
        }

        private void listGrade_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listGrade.SelectedIndex > -1)
            {
                Pasta pasta = ((Pasta)listGrade.SelectedItem);
                btnRemovePastaMusica.Enabled = pasta.Tipo.Equals(TipoPasta.MUSICA);
                btnRemovePastaComercial.Enabled = pasta.Tipo.Equals(TipoPasta.COMERCIAL);
            }
        }
        #endregion

        #region Movimenta Ítens
        private void btnAdicionaPastaMusica_Click(object sender, EventArgs e)
        {
            movimentaItem(listPastasMusicas, listGrade, false);
        }

        private void btnAdicionaPastaComercial_Click(object sender, EventArgs e)
        {
            movimentaItem(listPastasComerciais, listGrade, false);
        }

        private void btnRemovePastaMusica_Click(object sender, EventArgs e)
        {
            movimentaItem(listGrade, listPastasMusicas, true);
        }

        private void btnRemovePastaComercial_Click(object sender, EventArgs e)
        {
            movimentaItem(listGrade, listPastasComerciais, true);
        }

        private void movimentaItem(ListBox origem, ListBox destino, Boolean isRemove)
        {
            Object selecionado = origem.SelectedItem;
            if (isRemove)
            {
                origem.Items.Remove(selecionado);
            }
            else
            {
                destino.Items.Add(selecionado);
            }
            validaBotoesOrdenacao();
        }

        private void validaBotoesOrdenacao()
        {
            btnOrdenaMais.Enabled = listGrade.Items.Count > 0;
            btnOrdenaMenos.Enabled = listGrade.Items.Count > 0;
            btnGravaGrade.Enabled = listGrade.Items.Count > 0;
        }
        #endregion

        #region Ordenação
        private void btnOrdenaMais_Click(object sender, EventArgs e)
        {
            ordenaItem(listGrade, 'a', -1);
        }

        private void btnOrdenaMenos_Click(object sender, EventArgs e)
        {
            ordenaItem(listGrade, 'b', 1);
        }

        private void ordenaItem(ListBox list, char op, int indexAuxiliar)
        {
            int index = list.SelectedIndex;
            Object itemAtual = list.SelectedItem;

            bool condicao = false;

            switch (op)
            {
                case 'a':
                case 'A':
                    condicao = index > 0;
                    break;
                case 'b':
                case 'B':
                    condicao = index < (list.Items.Count - 1);
                    break;
            }

            if ((list.Items.Count > 1) && (condicao))
            {
                Object itemAuxiliar = list.Items[index + indexAuxiliar];
                list.Items[index] = itemAuxiliar;
                list.Items[index + indexAuxiliar] = itemAtual;
                list.SelectedIndex = index + indexAuxiliar;
            }
        }
        #endregion

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnGravaGrade_Click(object sender, EventArgs e)
        {
            saveFileDialog.DefaultExt = "m3u";
            saveFileDialog.ShowDialog();
            String filePath = saveFileDialog.FileName;
            if (filePath.Length > 0)
            {
                List<Pasta> pastas = getPastasDoListBox(listGrade);

                GeraArquivo gerador = new GeraArquivo(pastas);
                gerador.geraArquivo(pastas, filePath, Convert.ToInt16(qtdeBlocos.Value));
            }
            saveFileDialog.FileName = "";
        }

        private List<Pasta> getPastasDoListBox(ListBox list)
        {
            List<Pasta> listaConvertida = new List<Pasta>();

            foreach (Pasta pasta in list.Items)
            {
                listaConvertida.Add(pasta);
            }

            return listaConvertida;
        }
    }
}
